#ifndef DFN_H
#define DFN_H

#include <vector>
#include <set>
#include <map>

// 项目结构：lhs 为左部符号，rhs 为右部符号序列，dotPos 为点的位置
struct Item {
    int lhs;
    std::vector<int> rhs;
    size_t dotPos;

    bool operator<(const Item& other) const;
    bool operator==(const Item& other) const;
};

// 计算项目集的闭包
std::set<Item> closure(
    const std::set<Item>& items,
    const std::map<int, std::vector<std::vector<int>>>& grammar
);

// GO 转移函数
std::set<Item> go(
    const std::set<Item>& items,
    int symbol,
    const std::map<int, std::vector<std::vector<int>>>& grammar
);

// 构造 DFA：输出状态集和状态转移表
void constructDFA(
    const std::map<int, std::vector<std::vector<int>>>& grammar,
    std::vector<std::set<Item>>& states,
    std::map<std::pair<int, int>, int>& transitionTable
);

// 打印单个状态的项目集
void printState(int stateId, const std::set<Item>& items);

// 打印整个 DFA 的状态转移表
void printDFA(const std::map<std::pair<int, int>, int>& transitionTable);

#endif // DFN_H